package com.spring.boot.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 */
public class DynamicProxy implements InvocationHandler {

    private Object tar = null;
    /**
     * 返回动态代理对象，这样用记才能用代理类调用真实操作
     * @param obj  包含有真实业务实现对象
     * @return  代理对象
     */
    public Object bind(Object obj){
        //要把传入的真实对象保存，在下面代理中才能用
        this.tar = obj;
        Object o = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
        //第一个参数：类加载器
        //第二个参数：对象的所有接口
        //第三个参数：当前对象DynamicProxy是InvocationHandler子类也是这个对象
        //与之前的简单代理来说，动态的可以管到所有接口对象
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }

    //                   代理对象      执行的方法      参数
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this. ber();
        //通过反射执行这个真实对象的方法
        Object invoke = method.invoke(tar, args);
        this. afr();
        return invoke;
    }

    public void ber(){
        System.out.println("打开数据库！！");
    }
    public void afr(){
        System.out.println("关闭数据库！！");
    }

}
